#include <iostream>
#include <cstdlib>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>

void handler(int sig)
{
    std::cout << "get a sig: " << sig << std::endl;
}

int main()
{
    // 程序为什么会崩溃？非法访问、操作(?), 导致OS给进程发送信号啦！ --- 为什么
    // OS处理了硬件的问题(CR2页故障线性地址寄存器),从而向目标进程发生信号
    // signal(SIGSEGV, handler);
    // signal(SIGFPE, handler);
    // 崩溃了为什么会退出？默认是终止进程
    // 可以不退出吗？可以，捕捉了异常, 推荐终止进程(为什么？) --- 为什么？
    // 释放进程的上下文数据,包括溢出标志数据或其他异常数据

    // int *p = nullptr;
    // *p = 100; // SIGSEGV
    int a = 10;
    a /= 0;      // 8) SIGFPE
    while (true)
    {
        std::cout << "hello bit, pid: " << getpid() << std::endl;

        sleep(1);
    }
}

// int cnt = 1;
//
// void handler(int sig)
// {
//     alarm(1);
//     std::cout << "cnt: " << cnt << " get a sig: " << sig << std::endl;
//     // std::cout << "get a sig: " << sig << std::endl;
//     //exit(1);
// }
//
// int main()
// {
//     signal(SIGALRM, handler);
//
//     alarm(1); // 设定1S后的闹钟 -- 1S --- SIGALRM
//     // sleep(4);
//     // int n = alarm(0); // alarm(0): 取消闹钟， 返回上一个闹钟的剩余时间
//     // std::cout << "n : " << n << std::endl;
//     // sleep(10);
//     while (true)
//     {
//         // IO慢,8w多次
//         // std::cout << "cnt: " << cnt << std::endl;
//         // 80多w次
//         cnt++;
//         sleep(1);
//     }
// }

// void handler(int sig)
// {
//     std::cout << "get a sig: " << sig << std::endl;
// }
//
// int main()
// {
//     int cnt = 0;
//     // signal(SIGABRT, handler);
//     // 屏蔽全部信号,但9不可以被屏蔽
//     for(int i = 1; i <= 31; i++)
//         signal(i, handler);
//
//     while (true)
//     {
//         sleep(1);
//         std::cout << "hello bit, pid: " << getpid() << std::endl;
//
//         // 另外2中方式
//         // raise(3);
//         // abort();
//     }
// }

// // ./mykill 2 pid
// // kill 发送信号
// int main(int argc, char *argv[])
// {
//     if(argc != 3)
//     {
//         std::cerr << "Usage: " << argv[0] << " signum pid" << std::endl;
//         return 1;
//     }
//
//     pid_t pid = std::stoi(argv[2]);
//     int signum = std::stoi(argv[1]);
//     kill(pid, signum);
// }

// void hander(int sig)
// {
//     std::cout << "get a sig: " << sig << std::endl;
// }
//
// int main()
// {
//     // 对信号的自定义捕捉，只要捕捉一次，后续一直有效
//     // 1. 可以一直不产生
//     // 2. 可以对更多的信号进行捕捉
//     // 3. 2 SIGINT默认的动作是：终止进程
//     // 4. 2 SIGINT -> ctrl+c --- 给目标进程发送2号信号
//     signal(2, hander);
//     // signal(3, hander);
//     // signal(4, hander);
//     // signal(5, hander);
//     while(true)
//     {
//         std::cout << "hello bit, pid: " << getpid() << std::endl;
//         sleep(1);
//     }
//
//     return 0;
// }